package com.xxxx.yoyo.service.impl;

import java.util.List;

import com.xxxx.yoyo.bean.Goods;
import com.xxxx.yoyo.bean.Item;
import com.xxxx.yoyo.bean.Order;
import com.xxxx.yoyo.bean.User;
import com.xxxx.yoyo.dao.IOrderDao;
import com.xxxx.yoyo.dao.impl.OrderDaoImpl;
import com.xxxx.yoyo.service.IItemService;
import com.xxxx.yoyo.service.IOrderService;
import com.xxxx.yoyo.service.IUserService;

public class OrderServiceImpl implements IOrderService {
	
	
	private IOrderDao orderDao = new OrderDaoImpl();
	private IItemService itemService = new ItemServiceImpl();
	private IUserService userService = new UserServiceImpl();
	
	/**
	 * 把宠物加入到虚拟订单中
	 * @param goods 购买的宠物
	 * @param order 虚拟订单
	 */
	@Override
	public void addGoodsToOrder(Goods goods, Order order) {
		//获取要加入订单的宠物的id
		int goodId = goods.getId();
		
		//获取购买项列表
		List<Item> itemList = order.getItemList();
		
		//定义一个boolean变量,记录宠物是否曾经购买过.---假定没有购买过
		boolean isGoodsInOrder = false;
		
		//遍历购买项列表
		for(int i = 0; i < itemList.size(); i++) {
			Item item = itemList.get(i);
			//判断购买项对应的宠物是否和要添加的宠物相同
			if(item.getGoodId() == goodId){
				//如果遍历的时候,要添加的宠物存在于订单中,把boolean值改为true
				isGoodsInOrder = true;
				
				//修改购买项数量
				item.setAmount(item.getAmount() + 1);
				//修改购物车总数量
				order.setAmount(order.getAmount() + 1);
				//修改购物车总金额 
				order.setTotal(order.getTotal() + goods.getPrice());
				break;
			}	
		}
		
		if(isGoodsInOrder == false) {//说明没有买过
			//创建一个新的购买项
			Item item = new Item(goods.getPrice(), 1, goodId, goods);
			//把购买项加入到itemList中
			itemList.add(item);
			//修改购物车总数量
			order.setAmount(order.getAmount() + 1);
			//修改购物车总金额 
			order.setTotal(order.getTotal() + goods.getPrice());
		}
	}

	
	/**
	 * 从订单中减少宠物
	 * @param goods 要减少的宠物
	 * @param order 订单
	 * @return 如果订单中的宠物空了返回true, 否则返回false
	 */
	@Override
	public boolean lessenGoodsFromOrder(Goods goods, Order order) {
		//获取宠物的id
		int goodsId = goods.getId();
		
		//获取购买项列表
		List<Item> itemList = order.getItemList();
		
		//遍历购买项列表
		for(int i = 0; i < itemList.size(); i++) {
			//获取购买项
			Item item = itemList.get(i);
			if(item.getGoodId() == goodsId) {//此购买项就是要减少的宠物
				//减少购买项的数量
				item.setAmount(item.getAmount() - 1);
				//减少虚拟订单总宠物数量
				order.setAmount(order.getAmount() - 1);
				//减少虚拟订单总金额
				order.setTotal(order.getTotal() - goods.getPrice());
				
				//如果减少数量之后,该购买项的数量为0, 那么需要从itemList中删除这个购买项
				if(item.getAmount() == 0) {
					itemList.remove(i);
				}
				
				break;
			}
		}
		
		//当所有购买项都被删除之后,我们应该把虚拟订单也删掉,这样就能显示 "空空如也"
		if(itemList.size() == 0) {
			return true;
		}else {
			return false;
		}
		
	}


	/**
	 * 从订单中删除购买项
	 * @param goods 要删除的宠物
	 * @param order 订单
	 * @return 如果订单中的宠物空了返回true, 否则返回false
	 */
	@Override
	public boolean deleteGoodsFromOrder(Goods goods, Order order) {
		//获取宠物的id
		int goodsId = goods.getId();
		
		//获取购买项列表
		List<Item> itemList = order.getItemList();
		
		//遍历购买项列表
		for(int i = 0; i < itemList.size(); i++) {
			//获取购买项
			Item item = itemList.get(i);
			
			//如果找到了购买项
			if(item.getGoodId() == goodsId) {
				//获取购买数量
				int amount = item.getAmount();
				
				//减少订单中宠物总数量
				order.setAmount(order.getAmount() - amount);
				//减少订单中宠物的总金额
				order.setTotal(order.getTotal() - amount * goods.getPrice());
				
				//把item从itemList删除
				itemList.remove(i);
				break;
			}
		}
		
		//如果购买项空了,返回true
		if(itemList.size() == 0) {
			return true;
		}else {
			return false;
		}
		
	}

	/**
	 * 添加订单
	 * @param order 订单
	 * @return 添加成功返回true,添加失败返回false
	 */
	@Override
	public boolean addOrder(Order order) {
		int row = orderDao.insertOrder(order);
		if(row == 1) {
			return true;
		}else {
			return false;
		}
	}


	/**
	 * 根据订单信息查询订单的id
	 * @param order 订单
	 * @return 返回订单id
	 */
	@Override
	public int getIdByOrder(Order order) {
		int id = orderDao.selectIdByOrder(order);
		return id;
	}


	/**
	 * 根据订单id查询订单
	 * @param orderId 订单id
	 * @return 返回订单
	 */
	@Override
	public Order getOrderById(int orderId) {
		Order order = orderDao.selectOrderById(orderId);
		return order;
	}

	/**
	 * 更新订单信息
	 * @param order 订单
	 * @return 更新成功返回true,更新失败返回false
	 */
	@Override
	public boolean updateOrder(Order order) {
		int row = orderDao.updateOrder(order);
		if(row == 1) {
			return true;
		}else {
			return false;
		}
	}

	/**
	 * 根据用户的id查询用户所有订单
	 * @param userId 用户id
	 * @return 返回用户所有订单
	 */
	@Override
	public List<Order> getOrderListByUserId(int userId) {
		//获取订单列表(此时只有订单的基本信息,没有购买的宠物的信息)
		List<Order> orderList = orderDao.selectOrderListByUserId(userId);
		//遍历订单
		for(int i = 0; i < orderList.size(); i++) {
			//获取订单
			Order order = orderList.get(i);
			//获取订单的id
			int orderId = order.getId();
			//根据订单id获取购买项列表
			List<Item> itemList = itemService.getItemListByOrderId(orderId);
			//把itemList设置给order
			order.setItemList(itemList);
		}
		return orderList;	
	}

	/**
	 * 根据页码，每页条数查询订单列表
	 * @param page 页码
	 * @param size 每页条数
	 * @return 查询到的订单列表
	 */
	@Override
	public List<Order> getOrderList(int page, int size) {
		//获取订单列表（基本信息）》
		List<Order> orderList = orderDao.selectOrderList(page, size);
		//遍历订单列表
		for(int i=0 ; i<orderList.size() ; i++){
			//获取订单
			Order order = orderList.get(i);
			//获取订单的1d
			int orderId = order.getId();
			//根据订单1d查询此订单的购买项列表
			List<Item> itemList = itemService.getItemListByOrderId(orderId);
			//把itemList设置到order里
			order.setItemList(itemList);
			//获取用户id
			int userId = order.getUserId();
			//根据用户1d获取用户信息
			User user = userService.getUserById(userId);
			//把user设置给order
			order.setUser(user);
		}
		return orderList;
	}

	/**
	 * 获取订单的总条数
	 * @return 返回订单的总条数
	 */
	@Override
	public long getOrderCount() {
		long count = orderDao.selectOrderCount();
		return count;
	}

	/**
	 * 根据订单状态，页码，每页条数查询订单列表
	 * @param status 订单状态  1表示未付款，2表示已付款，3表示配送中，4表示已完成
	 * @param page 页码
	 * @param size 每页条数
	 * @return 返回查到的订单列表
	 */
	@Override
	public List<Order> getOrderList(int status, int page, int size) {
		//获取订单列表（基础信息）
		List<Order> orderList = orderDao.selectOrderList(status, page, size);
		//遍历订单列表
		for(int i=0 ; i<orderList.size() ; i++){
			//获取订单
			Order order = orderList.get(i);
			//获取订单的1d
			int orderId = order.getId();
			//根据订单1d查询此订单的购买项列表
			List<Item> itemList = itemService.getItemListByOrderId(orderId);
			//把itemList设置到order里
			order.setItemList(itemList);
			//获取用户id
			int userId = order.getUserId();
			//根据用户1d获取用户信息
			User user = userService.getUserById(userId);
			//把user设置给order
			order.setUser(user);
		}
		return orderList;
	}

	/**
	 * 根据订单状态获取订单数量
	 * @param status 订单状态  1表示未付款，2表示已付款，3表示配送中，4表示已完成
	 * @return 返回订单数量
	 */
	@Override
	public long getOrderCount(int status) {
		long count = orderDao.selectOrderCount(status);
		return count;
	}

}
